home *** CD-ROM | disk | FTP | other *** search
/ Turnbull China Bikeride / Turnbull China Bikeride - Disc 1.iso / HENSA / GRAPHICS / SPRite_TOOLS.ARC / c / spr_diff < prev    next >
Text File  |  1998-04-06  |  7KB  |  181 lines

  1. /************************************************************************
  2.  *                                                                      *
  3.  * spr_diff.c                                                           *
  4.  *                                                                      *
  5.  * Calculates various measeures of how different two sprites are.       *
  6.  * For use with sprites of the same size, but can have differing BPP.   *
  7.  * Aimed mainly as a test of how close an image is to the original      *
  8.  * after spr_fsi processing.                                            *
  9.  *                                                                      *
  10.  * Version 1.01 (13-Sep-1994)                                           *
  11.  *         1.02 (06-Apr-1998)     File opened as binary             *
  12.  *                                                                      *
  13.  * (C) 1993-8 DEEJ Technology PLC                                       *
  14.  *                                                                      *
  15.  ************************************************************************/
  16.  
  17. #include <stdlib.h>
  18. #include <stdio.h>
  19. #include <string.h>
  20. #include <math.h>
  21. #include "io.h"
  22. #include "sprite.h"
  23.  
  24.  
  25. int main(int argc, char** argv)
  26. {
  27.         FILE *inf1, *inf2;
  28.         int          x,y;
  29.         int          size;
  30.         uint         rgb;
  31.         uint         r1, g1, b1;
  32.         uint         r2, g2, b2;
  33.         int          rd, gd, bd;
  34.         int          rv, gv, bv;
  35.         spr_info_str spr1, spr2;
  36.  
  37.         double       total_lsq    = 0;
  38.         int          total_intn   = 0;
  39.         int          total_chrom  = 0;
  40.         int          total_accum  = 0;
  41.         int          total_red    = 0;
  42.         int          total_green  = 0;
  43.         int          total_blue   = 0;
  44.         double       lsq_diff     = 0;
  45.         int          intn_diff    = 0;
  46.         int          chrom_diff   = 0;
  47.         int          accum_diff   = 0;
  48.         int          red_diff     = 0;
  49.         int          green_diff   = 0;
  50.         int          blue_diff    = 0;
  51.  
  52.         /* cant use file_args() as using two input files */
  53.  
  54.         if(argc!=3)
  55.         {
  56.                 fprintf(stderr,"Syntax: %s <sprite> <sprite>\n", argv[0]);
  57.                 return(1);
  58.         }
  59.  
  60.         if((inf1 = fopen(argv[1],"rb")) == 0)
  61.         {
  62.                 fprintf(stderr,"Could not open sprite 1\n");
  63.                 return(2);
  64.         }
  65.         if((inf2 = fopen(argv[2],"rb")) == 0)
  66.         {
  67.                 fprintf(stderr,"Could not open sprite 2\n");
  68.                 return(3);
  69.         }
  70.  
  71.         read_sprite(&spr1, inf1);
  72.         read_sprite(&spr2, inf2);
  73.  
  74.         if(spr1.X != spr2.X  &&  spr1.Y != spr2.Y)
  75.         {
  76.                 fprintf(stderr,"Sprites have different sizes\n");
  77.                 return(40);
  78.         }
  79.  
  80.         progress_start("Comparing sprites          :");
  81.  
  82.         for(y=0; y<spr1.Y; y++)
  83.         {
  84.                 for(x=0; x<spr1.X; x++)
  85.                 {
  86.                         rgb = spr1.read_pixel_rgb(&spr1, x, y);
  87.                         r1  = (rgb >>  8) &0xFF;
  88.                         g1  = (rgb >> 16) &0xFF;
  89.                         b1  = (rgb >> 24) &0xFF;
  90.  
  91.                         rgb = spr2.read_pixel_rgb(&spr2, x, y);
  92.                         r2  = (rgb >>  8) &0xFF;
  93.                         g2  = (rgb >> 16) &0xFF;
  94.                         b2  = (rgb >> 24) &0xFF;
  95.  
  96.                         rd  = r1>r2 ? r1-r2 : r2-r1;
  97.                         gd  = g1>g2 ? g1-g2 : g2-g1;
  98.                         bd  = b1>b2 ? b1-b2 : b2-b1;
  99.  
  100.                         rv  = (r1+r2)/2;
  101.                         gv  = (g1+g2)/2;
  102.                         bv  = (b1+b2)/2;
  103.  
  104.                         total_red   += rv;
  105.                         red_diff    += rd;
  106.                         total_green += gv;
  107.                         green_diff  += gd;
  108.                         total_blue  += bv;
  109.                         blue_diff   += bd;
  110.                         accum_diff  += (r1-r2)+(g1-g2)+(b1-b2);
  111.                 }
  112.  
  113.                 progress(y, spr1.Y);
  114.         }
  115.  
  116.         progress_finish();
  117.  
  118.         size        = spr1.X * spr1.Y;
  119.  
  120.         lsq_diff    = sqrt((double)red_diff*(double)red_diff       +
  121.                            (double)green_diff*(double)green_diff   +
  122.                            (double)blue_diff*(double)blue_diff)    /
  123.                       sqrt((double)10.0);
  124.         total_lsq   = sqrt((double)total_red*(double)total_red     +
  125.                            (double)total_green*(double)total_green +
  126.                            (double)total_blue*(double)total_blue)  /
  127.                       sqrt((double)10.0);
  128.  
  129.         intn_diff   = (red_diff*3    +
  130.                        green_diff*6  +
  131.                        blue_diff)    / 10;
  132.         total_intn  = (total_red*3   +
  133.                        total_green*6 +
  134.                        total_blue)   / 10;
  135.  
  136.         chrom_diff  = (red_diff    +
  137.                        green_diff  +
  138.                        blue_diff)  / 3;
  139.         total_chrom = (total_red   +
  140.                        total_green +
  141.                        total_blue) / 3;
  142.  
  143.     if(accum_diff < 0) accum_diff = -accum_diff;
  144.     total_accum = red_diff + green_diff + blue_diff;
  145.     if(total_accum == 0) total_accum = 1;
  146.  
  147.         printf("Least Squares difference   : %-10.0f %6.2f%%\n",
  148.                 lsq_diff,
  149.                 lsq_diff*100.0/total_lsq);
  150.         printf("Least Squares diff average : %-10.0f %6.2f%%\n",
  151.                 lsq_diff/(double)size,
  152.                 lsq_diff*100.0/((double)size*255.0));
  153.         printf("Intensity difference       : %-10d %6.2f%%\n",
  154.                 intn_diff,
  155.                 (double)intn_diff*100.0/(double)total_intn);
  156.         printf("Intensity diff average     : %-10d %6.2f%%\n",
  157.                 intn_diff/size,
  158.                 (double)intn_diff*100.0/((double)size*255.0));
  159.         printf("Chrominance difference     : %-10d %6.2f%%\n",
  160.                 chrom_diff,
  161.                 (double)chrom_diff*100.0/(double)total_chrom);
  162.         printf("Chrominance diff average   : %-10d %6.2f%%\n",
  163.                 chrom_diff/size,
  164.                 (double)chrom_diff*100.0/((double)size*255.0));
  165.         printf("Red difference             : %-10d %6.2f%%\n",
  166.                 red_diff,
  167.                 (double)red_diff*100.0/(double)total_red);
  168.         printf("Green difference           : %-10d %6.2f%%\n",
  169.                 green_diff,
  170.                 (double)green_diff*100.0/(double)total_green);
  171.         printf("Blue difference            : %-10d %6.2f%%\n",
  172.                 blue_diff,
  173.                 (double)blue_diff*100.0/(double)total_blue);
  174.         printf("Accumulated difference     : %-10d %6.2f%%\n",
  175.                 accum_diff,
  176.                 (double)accum_diff*100.0/(double)total_accum);
  177.  
  178.         fclose(inf1);
  179.         fclose(inf2);
  180. }
  181.